package com.constellio.app.ui.framework.components.mouseover; import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.lang3.StringUtils; import com.constellio.app.ui.util.ComponentTreeUtils; import com.constellio.data.dao.services.idGenerator.UUIDV1Generator; import com.vaadin.server.AbstractExtension; import com.vaadin.ui.Component; import com.vaadin.ui.JavaScript; import com.vaadin.ui.TabSheet; import com.vaadin.ui.TabSheet.SelectedTabChangeEvent; import com.vaadin.ui.TabSheet.SelectedTabChangeListener; @com.vaadin.annotations.JavaScript("theme://nicetitle/nicetitle.js") @com.vaadin.annotations.StyleSheet("theme://nicetitle/nicetitle.css") public class NiceTitle extends AbstractExtension { public static final String DISABLED_STYLE = "nicetitle-link-disabled"; private Component component; private String title; private boolean visibleWhenDisabled; public NiceTitle(Component component, String title) { this(component, title, true); } public NiceTitle(Component component, String title, boolean visibleWhenDisabled) { this.component = component; this.title = title; this.visibleWhenDisabled = visibleWhenDisabled; } @Override public void attach() { super.attach(); if (StringUtils.isNotBlank(title)) { TabSheet tabSheet = ComponentTreeUtils.findParent(component, TabSheet.class); if (tabSheet != null) { tabSheet.addSelectedTabChangeListener(new SelectedTabChangeListener() { @Override public void selectedTabChange(SelectedTabChangeEvent event) { runJavascript(); } }); } runJavascript(); } } private void runJavascript() { String titleEscaped = StringEscapeUtils.escapeJavaScript(title); String componentId = component.getId(); if (componentId == null) { componentId = new UUIDV1Generator().next(); component.setId(componentId); } component.addStyleName("nicetitle-link"); StringBuilder js = new StringBuilder(); String getById = "document.getElementById(\"" + componentId + "\")"; js.append("if (" + getById + ") {"); if (visibleWhenDisabled) { js.append(getById + ".className = " + getById + ".className.replace(\"v-disabled\", \"" + DISABLED_STYLE + "\")"); js.append(";"); } js.append(getById + ".setAttribute(\"title\", \"" + titleEscaped + "\")"); js.append(";"); js.append("makeNiceTitleA(" + getById + ")"); js.append("}"); JavaScript javascript = JavaScript.getCurrent(); javascript.execute(js.toString()); } @Override public void detach() { JavaScript javascript = JavaScript.getCurrent(); javascript.execute("hideNiceTitle()"); super.detach(); } }